﻿using System;

public class BitWriter
{
    /// <summary>
    /// 将 value 的低 len 位写入 byte[] data，从 startBit 开始（LSB first）。
    /// </summary>
    /// <param name="data">目标 byte 数组</param>
    /// <param name="value">要写入的数值</param>
    /// <param name="startBit">起始位（0-based）</param>
    /// <param name="len">位长度</param>
    /// <returns>修改后的 byte 数组</returns>
    public static byte[] WriteBits(byte[] data, uint value, int startBit, int len)
    {
        if (data == null || data.Length == 0)
            throw new ArgumentException("Data array cannot be null or empty.");
        if (startBit < 0 || len <= 0 || startBit + len > data.Length * 8)
            throw new ArgumentException("Invalid startBit or len: out of bounds.");
        if (len > 32)
            throw new ArgumentException("Length cannot exceed 32 bits for uint value.");

        // 创建副本以避免修改原始数组
        byte[] result = (byte[])data.Clone();

        // 从 value 的低 len 位开始，逐位写入
        for (int i = 0; i < len; i++)
        {
            // 获取 value 的第 i 位（从低位到高位）
            int bitValue = (int)((value >> i) & 1);

            // 计算目标位所在的字节索引和位索引
            int targetBit = startBit + i;
            int byteIndex = targetBit / 8;
            int bitIndex = targetBit % 8;

            // 设置或清除目标位
            if (bitValue == 1)
                result[byteIndex] |= (byte)(1 << bitIndex);
            else
                result[byteIndex] &= (byte)~(1 << bitIndex);
        }

        return result;
    }

    // 测试代码
    public static void Main()
    {
        // 初始化测试数据
        byte[] data = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        uint value = 0x7D0; // 十进制 2000，二进制 11111010000
        int startBit = 0;
        int len = 11;

        // 调用方法
        byte[] result = WriteBits(data, value, startBit, len);

        // 输出结果
        Console.WriteLine("Result: " + BitConverter.ToString(result).Replace("-", " "));
    }
}